# 作者：李靖、王真爱
'''以下为样本数据集'''
group = [[1, 20], [1, 16], [1, 3], [25, 15], [25, 10], [25, 2]]  # 提前保存样本数据
labels1 = ['A', 'A', 'A', 'B', 'B', 'B']  # 保存各样本数据对应的分类类型
labels2 = [1, 1, 1, 2, 2, 2]  # 将样本分类数字化


'''以下为计算待分类数据与样本的最小值'''
a1 = []  # 待用，用于保存最小值
b1 = []  # 待用，用于制作a1数组副本
b2 = []  # 待用，用于保存a1中各个值在当前数组中的排名
z = [[14, 1]]  # 待分类数据
x = []  # 保存横坐标差值
y = []  # 保存纵坐标差值

for i in range(6):
    t = 0
    j = 0
    t1 = group[i][j]-z[0][0]  # 待分类数据X轴与样本X轴差值
    x.append(t1)
    t2 = group[i][j + 1]-z[0][1]  # 待分类样本数据Y轴与样本Y轴差值
    y.append(t2)

for i in range(6):    
    t3 = round(float((x[i]**2 + y[i]**2)**0.5), 3)  # 计算待分类数据与样本的最小距离，精确到三位小数
    a1.append(t3)
    t3 = 0

for i in range(5):
    j=5-i
    for j in range(5-j):
        if a1[i] <= a1[i+1]:  
            t3 = i + 1

print("a1 = ", a1)  # 测试代码，便于验证

s1 = len(a1)
for i in range(s1):  # 将最小距离数据保存到另一数组中
    b1.append(a1[i])

print("b1 = ", b1)  # 测试代码，便于验证


'''以下为排序'''
s2 = len(b1)
for i in range(s1):  # 创建空数组用于存放a1中各个最小值的排名
    b2.append(0)
print("b2 = ", b2)  # 测试代码，便于验证
print("a1长度为：", s1)  # 测试代码，便于验证

kim = 0
nex = 0

for i in range(s1-1):
    temp = 0.0  # 存放当前循环中找到的最小值
    temp2 = 0.0
    kim = 0
    nex = kim + 1
    print(kim, nex)
    while True:  # 假设收个数据为最小值，与之后的所有数据进行比较，得到当前循环中的最小值
        if len(b1) == 1:
            break
        elif nex == len(b1) or kim == len(b1) - 1:            
            break
        elif b1[kim] <= b1[nex]:
            temp = b1[kim]
            kim = kim
            nex = nex + 1
            continue
        else:
            temp = b1[nex]
            kim = nex
            nex = nex + 1
            continue
            
    print("最小值位置", kim + 1)  # 测试代码，便于验证，输出当前循环找到的最小值
    b1.pop(kim)
    print("移除", temp)  # 测试代码，便于验证，将当前循环找到的最小值从a1副本数组b1中删除
    print(b1)
    k = 0
    
    while True:  # 将当前循环找到的最小值排名保存到对应的b2数组中
        if a1[k] != temp:
            k = k + 1
            continue
        else:
            b2[k] = i + 1
            break
    print(b2)  # 测试代码，便于验证

    if len(b1) == 1:
        temp2 = b1[0]
        print("剩余", b1)  # 测试代码，便于验证
        k = 0    
        while True:
            if a1[k] != temp2:
                k = k + 1
                continue
            else:
                b2[k] = s1
                break
    print(b2)  # 输出已找到的最小值排名数组
          
print("b2 = ", b2)  # 整个数组排序完毕后，将a1数组中各个最小值的排名b2数组输出


'''以下为输入K值的大小将分类结果输出'''
k = int(input("请输入K值大小："))
print(k)
k1 = 0   # 记录当前排名
k2 = 0   # 寻找当前最小值位置
k3 = 0   # 记录属于A等的个数
k4 = 0   # 记录属于B等的个数
while True:
    k1 = k1 + 1
    k2 = 0
    if k > s1 or k == 0:  # 判断K值是否小于或大于样本个数，输出提示！
        print("超出范围，无效!!!")
        break
    elif k1 <= k:  # K值正常的话，根据K值大小，从b2数组中的最小值开始逐一查找，并将查找到的结果A和B个数分别保存到K3和K4中
        while True:
            print("K2：", k2)  # 测试代码，便于验证
            print("K1：", k1)  # 测试代码，便于验证
            if k2 > s1:  # 当遍历到最后一个数据时跳出当前循环
                break
            elif k2 <= s1 and b2[k2] == k1 and labels1[k2] == 'A':  # 用K3保存在当前K值下，A的个数
                k3 = k3 + 1
                k2 = k2 + 1
                print("A的个数K3：", k3)  # 测试代码，便于验证
                print("K2：", k2)  # 测试代码，便于验证
                print("K1：", k1)  # 测试代码，便于验证
                break
            elif k2 <= s1 and b2[k2] == k1 and labels1[k2] == 'B':  # 用K4保存在当前K值下，B的个数
                k4 = k4 + 1
                k2 = k2 + 1
                print("B的个数K4：", k4)  # 测试代码，便于验证
                print("K2：", k2)  # 测试代码，便于验证
                print("K1：", k1)  # 测试代码，便于验证
                break
            else:
                k2 = k2 + 1
    else:
        break


'''以下为根据计算得到的A和B的个数，对分类结果进行判断'''    
k1 = k1 - 1   
if k3 == k4 and k3 != 0 and k4 != 0:  # 最终根据计算得到的K3和K4值的大小，将样本数据进行归类。
    print("该样本可能属于A，也可能属于B")
elif k3 > k4:
    print("该样本很可能属于A")
elif k3 < k4:
    print("该样本很可能属于B")